export type BlockType = 'text' | 'image';
export interface Block {
  id: string;
  type: BlockType;
  content: string; // 文本或图片URL（可能是本地临时路径）
}

/** 可选：把本地临时路径映射成服务器URL。可以传函数或映射表对象 */
export type ResolveImageUrl = ((u: string) => string) | Record<string, string>;

/** 简单HTML转义，保证文本安全 */
const escapeHtml = (s: string) =>
  s
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;');

/** 是否仍是本地临时路径（未上传） */
const isLocalTemp = (u: string) =>
  /^wxfile:\/\//.test(u) || /^https?:\/\/tmp\//.test(u) || /^blob:/.test(u);

const resolveUrl = (src: string, resolver?: ResolveImageUrl) => {
  if (!resolver) return src;
  return typeof resolver === 'function'
    ? resolver(src)
    : (resolver[src] ?? src);
};

/** 核心：把 blocks 转成可直接给 <RichText nodes={...} /> 使用的 HTML 字符串 */
export const blocksToHTML = (
  blocks: Block[],
  resolver?: ResolveImageUrl
): string => {
  if (!Array.isArray(blocks) || blocks.length === 0) return '<p><br/></p>';

  // 忽略尾部纯空文本块（编辑时的“继续输入…”）
  let end = blocks.length;
  while (end > 0) {
    const b = blocks[end - 1];
    if (b.type === 'text' && (!b.content || b.content.trim() === '')) end--;
    else break;
  }
  if (end === 0) return '<p><br/></p>';

  const pieces: string[] = [];

  for (let i = 0; i < end; i++) {
    const b = blocks[i];
    if (b.type === 'text') {
      if (!b.content) continue;
      // 保留换行：\n -> <br/>
      const html = escapeHtml(b.content).replace(/\n/g, '<br/>');
      pieces.push(`<p>${html}</p>`);
    } else if (b.type === 'image') {
      // 图片：替换为服务器URL，并加内联样式自适应（rich-text内部不吃外部CSS）
      const raw = b.content || '';
      const url = resolveUrl(raw, resolver);
      if (!url || isLocalTemp(url)) {
        // 仍是本地临时路径，跳过（也可选择抛错/阻止发布）
        continue;
      }
      pieces.push(
        `<p><img src="${escapeHtml(
          url
        )}" style="max-width:100%;height:auto;display:block;"/></p>`
      );
    }
  }

  return pieces.length ? pieces.join('') : '<p><br/></p>';
};

/**
 * 提取所有文本块为一个字符串。
 * - 默认：每个文本块之间用空行分隔（"\n\n"），块内的换行原样保留。
 * - 会自动忽略**尾部纯空文本块**（编辑时用于“继续输入…”的占位）。
 */
export const blocksToPlainText = (
  blocks: Block[],
  options?: { join?: string; trim?: boolean }
): string => {
  const join = options?.join ?? '\n\n';
  const shouldTrim = options?.trim ?? true;

  if (!Array.isArray(blocks) || blocks.length === 0) return '';

  // 忽略尾部纯空文本块
  let end = blocks.length;
  while (end > 0) {
    const b = blocks[end - 1];
    if (b.type === 'text' && (!b.content || b.content.trim() === '')) end--;
    else break;
  }
  if (end === 0) return '';

  const parts: string[] = [];
  for (let i = 0; i < end; i++) {
    const b = blocks[i];
    if (b.type === 'text' && b.content) {
      parts.push(b.content); // 保留块内的 \n
    }
  }

  const out = parts.join(join);
  return shouldTrim ? out.trim() : out;
};
